package com.jzy.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 *  RabbitAutoConfiguration
 *  自动配置了RabbitTemplate amqpAdmin   RabbitMessagingTemplate
 *  使用amqpAdmin创建exchange,queue,binding
 *  RabbitProperties 配置信息
 *  rabbitListener 监听消息 @EnableRabbit开启监听
 */

/**
 * 幂等解决方案
 *  1.token机制 使用lua脚本 保证读取,对比,删除的原子性操作
 *  2.各种锁机制: 数据库悲观锁select for update    数据库乐观锁   业务层分布式锁
 *  3.各种唯一约束    唯一订单号
 *  4.redis防重处理   加一层,计算数据的md5值放入redis,想检查md5值存不存在  百度网盘妙传功能
 *  5.防重表 数据库防重表,使用订单表id作为唯一约束
 *  6.全局请求 唯一id    feign请求重试,调用接口时,生成一个唯一id.    #使用nginx设置每一个请求的唯一ID
 */

/**
 * 如何保证消息的可靠性
 * 1.消息丢失
 *  由于网络没有消息发送出去
 *      (1)try/catch重试发送  (2)做好日志记录(保存消息的详细信息到数据库),定期扫描数据库
 *  宕机,消息没有持久化完成,消息没有抵达队列
 *      (1)生产者消息确认机制,returnCallBack,confirmCallBack
 *  自动ack状态下,消费没有消费成功,宕机,导致消息假消费
 *       手动ack模式
 *
 * 2.消息重复
 *  消费者消费成功,ack提交时宕机,ack失败,服务器重发
 *     (1)业务设计为幂等的   (2)防重表
 *
 * 3.消息积压
 *   消费者宕机, 消费者消费能力不足, 发送者发送流量太大
 *   (1)上线更多的消费者    (2)限制流量
 */
@EnableRedisHttpSession
@EnableRabbit
@SpringBootApplication
@EnableFeignClients(basePackages = "com.jzy.gulimall.order.feign")
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
